package com.example.generic_;

public class Generic03 {
    public static void main(String[] args) {
        //jdk 1.7之后定义泛型可以不用写在后面的< >里面
        //特别强调: E具体的数据类型在定义Person对象的时候指定, 即在编译期间, 就确定E是什么类型
        Person1<String> sp = new Person1<>("sp");
        System.out.println(sp.s.getClass());//查看sp的s是什么类型
        sp.showClass();
        /*
        可以这样理解上面的Person类
            class Person1{
            String s;//E表示s 的数据类型,该数据类型在定义Person对象的时候指定, 即在编译期间, 就确定E是什么类型

            public Person1(String s){//E也可以是参数类型
                this.s = s;
            }

            public String f(){//返回类型使用E
                return s;
            }
        }
         */


        Person1<Integer> integerPerson1 = new Person1<>(100);
        /*
            class Person1<Integer>{
            Integer s;//E表示s 的数据类型,该数据类型在定义Person对象的时候指定, 即在编译期间, 就确定E是什么类型

            public Person1(Integer s){//E也可以是参数类型
                this.s = s;
            }

            public Integer f(){//返回类型使用E
                return s;
            }
        }
         */
    }
}

/**
 * 4. 泛型的作用是: 可以在类声明时通过一个标识表示类中某个属性的类型,
 *    或者是某个方法的返回值的类型, 或者是参数类型
 */
class Person{
    String s;//常用的方法指定属性的类型, 只能是String类型
}

class Person1<E>{
    E s;//E表示s 的数据类型,该数据类型在定义Person对象的时候指定, 即在编译期间, 就确定E是什么类型

    public Person1(E s){//E也可以是参数类型
        this.s = s;
    }

    public E f(){//返回类型使用E
        return s;
    }
    public void showClass(){
        System.out.println(s.getClass());
    }
}